package controller;

import java.rmi.RemoteException;
import java.util.ArrayList;
import java.util.List;

import model.Area;
import model.Comanda;
import model.Deposito;
import model.ItemComanda;
import model.ItemVenta;
import model.Plato;
import model.Salon;
import model.Sucursal;
import model.Venta;
import beans.ComandaBean;
import dao.HibernateComandaDAO;
import dto.ComandaDTO;
import dto.MesaDTO;
import exceptions.ProductoException;

public class AdministradorComanda  {
	private static AdministradorComanda instancia;
	
	private AdministradorComanda(){
		
	}
	public static AdministradorComanda getInstancia(){
		if(instancia==null)
			instancia=new AdministradorComanda();
		return instancia;
	}
	public List<ComandaBean> fromModelTOBean(List<Comanda> comandas) {
		List<ComandaBean> comandasBean=new ArrayList<ComandaBean>();
		for (Comanda comanda : comandas) {
			ComandaBean comandaBean=null;
			if(comanda!=null){
				comandaBean=new ComandaBean();
				comandaBean.setIdComanda(comanda.getId());
				comandaBean.setNumeroMesa(comanda.getNumeroMesa());
				comandaBean.setEstado(comanda.getEstado());
				comandaBean.setItems(AdministradorItemComanda.getInstancia().fromModelTOBean(comanda.getItems()));
			}
			comandasBean.add(comandaBean);
		}
		return comandasBean;
	}
	
	public void grabarComanda(Comanda comanda) {
		List<Comanda> comandas=new ArrayList<Comanda>();
		comandas.add(comanda);
		List<ComandaBean> cb=fromModelTOBean(comandas);
		HibernateComandaDAO.getInstancia().grabarComanda(cb.get(0));
		
	}
	
	public List<Comanda> fromDTOTOModel(List<ComandaDTO> comandasDTO) {
		List<Comanda> comandas=new ArrayList<Comanda>();
		for (ComandaDTO comandaDTO : comandasDTO) {
			Comanda comanda=new Comanda();
			comanda.setId(comandaDTO.getId());
			comanda.setNumeroMesa(comandaDTO.getNumeroMesa());
			comanda.setEstado(comandaDTO.getEstado());
			comanda.setItems(AdministradorItemComanda.getInstancia().fromDTOTOModel(comandaDTO.getItems()));
			comandas.add(comanda);
		}
		return comandas;
	}
	
	public List<ComandaDTO> fromModelTODTO(List<Comanda> comandas) {
		List<ComandaDTO> comandasDTO=new ArrayList<ComandaDTO>();
		for (Comanda comanda : comandas) {
			ComandaDTO comandaDTO=new ComandaDTO();
			comandaDTO.setId(comanda.getId());
			comandaDTO.setNumeroMesa(comanda.getNumeroMesa());
			comandaDTO.setEstado(comanda.getEstado());
			comandaDTO.setItems(AdministradorItemComanda.getInstancia().fromModelTODTO(comanda.getItems()));
			comandasDTO.add(comandaDTO);
		}
		return comandasDTO;
	}
	
	public List<Comanda> fromBeanTOModel(List<ComandaBean> comandasBean) {
		List<Comanda> comandas=new ArrayList<Comanda>();
		for (ComandaBean comandaBean : comandasBean) {
			Comanda comanda=null;
			if(comandaBean!=null){
				comanda=new Comanda();
				comanda.setId(comandaBean.getIdComanda());
				comanda.setNumeroMesa(comandaBean.getNumeroMesa());
				comanda.setEstado(comandaBean.getEstado());
				comanda.setItems(AdministradorItemComanda.getInstancia().fromBeanTOModel(comandaBean.getItems()));
			}		
			comandas.add(comanda);
		}
		return comandas;
	}
	public Comanda buscarComanda(Comanda comanda) {
		List<Comanda>comandas=new ArrayList<Comanda>();
		comandas.add(comanda);
		List<ComandaBean> cb=fromModelTOBean(comandas);
		ComandaBean comandab=HibernateComandaDAO.getInstancia().buscarComanda(cb.get(0));
		List<ComandaBean>comandasBean=new ArrayList<ComandaBean>();
		comandasBean.add(comandab);
		return fromBeanTOModel(comandasBean).get(0);
	}
	
	public Comanda generarComanda(List<ItemComanda>items, MesaDTO m1, Sucursal suc) throws Exception{
		suc=Sistema.getInstancia().buscarSucursal(suc);
		Comanda comanda=new Comanda();
	
		comanda.setNumeroMesa(m1.getNumero());
		//List<ItemComanda>listaItems=AdministradorItemComanda.getInstancia().fromDTOTOModel(items);
		//comanda.setItems(listaItems);
		comanda.setItems(items);
		comanda.setEstado("no despachada");
		
		AdministradorComanda.getInstancia().grabarComanda(comanda);
		comanda=AdministradorComanda.getInstancia().buscarUltimaComanda();
		
		suc=Sistema.getInstancia().buscarSucursal(suc);
		Venta v=suc.getVentaAbierta(m1.getNumero());
		
		v.addComanda(comanda);
		AdministradorVenta.getInstancia().merge(v);
			
		
		//AdministradorSucursal.getInstancia().updateSucursal(suc);
		
		//this.notificarObservers();//se notificara a las areas para que preparen los platos.
		//AdministradorSucursal.getInstancia().merge(suc);
		suc=Sistema.getInstancia().buscarSucursal(suc);
		
		v=suc.getVentaAbierta(m1.getNumero());
		//29/11/2013 Comanda comandita=AdministradorVenta.getInstancia().buscarComanda(v);
		Comanda comandita=AdministradorComanda.getInstancia().buscarUltimaComanda();
		comanda=v.getComanda(comandita);
		//Comanda comandaAux=v.getComandas().get(0);
		
		Salon s=suc.getSalon();						//Agrego la comanda al salon
		s.addComanda(comanda);
		AdministradorSalon.getInstancia().merge(s); //Agrego el idSalon a la comanda
		
		this.despacharComanda(comanda, v, suc);
		
			
		return comanda;
		
		
	}
	private Comanda buscarUltimaComanda() {
		ComandaBean comanda=HibernateComandaDAO.getInstancia().buscarUltimaComanda();
		return fromBeanTOModel(comanda);
	}
	private Comanda fromBeanTOModel(ComandaBean comandaBean) {
		Comanda comanda=null;
		if(comandaBean!=null){
			comanda=new Comanda();
			comanda.setId(comandaBean.getIdComanda());
			comanda.setNumeroMesa(comandaBean.getNumeroMesa());
			comanda.setEstado(comandaBean.getEstado());
			comanda.setItems(AdministradorItemComanda.getInstancia().fromBeanTOModel(comandaBean.getItems()));
		}		
		return comanda;
	}
	public void despacharComanda(Comanda c,Venta v,Sucursal suc) throws RemoteException, ProductoException {
		
		List<ItemVenta>itemsVenta=new ArrayList<ItemVenta>();
		
		
			
		for(ItemComanda itc:c.getItems()){
			Plato p=itc.getPlato();
			Area a=suc.getArea(p.getArea());
			a.addTarea(itc);										//Le Agrego la tarea al area
			AdministradorArea.getInstancia().prepararPlato(itc,a); 
			
			// Hago que busque nuevamente el deposito porque estaba pisando 
			// el ajuste de inventario con el merge. TE LO DIJE JUANCITO!!
			Deposito depo = a.getDeposito();
			depo = AdministradorDeposito.getInstancia().buscarDeposito(depo);
			a.getDeposito().setStock(depo.getStock());
			
			AdministradorArea.getInstancia().merge(a);				//Le agrego al item el idArea
			
			ItemVenta itv=new ItemVenta();
			itv.setEstado("A facturar");
			itv.setCantidad(itc.getCantidad());
			itv.setItem(itc.getPlato());
			itemsVenta.add(itv);
		}
		
		
		v.addItems(itemsVenta);  						//SE ESTABAN SETEANDO, OSEA BORRABA LOS ITEMS QUE YA TENIA
		
		AdministradorVenta.getInstancia().updateVenta(v);
		
		
		//v.setId(1);				COMO ES QUE LE SETEA UN ID?
		c.setEstado("despachada");
		
		AdministradorComanda.getInstancia().merge(c);
		//this.updateItemsComanda(c);
		//AdministradorSucursal.getInstancia().updateSucursal(suc);
		
		
	}
	private void merge(Comanda c) {
		ComandaBean cb=fromModelTOBean(c);
		HibernateComandaDAO.getInstancia().merge(cb);
		
	}
	private ComandaBean fromModelTOBean(Comanda comanda) {
		ComandaBean comandaBean=null;
		if(comanda!=null){
			comandaBean=new ComandaBean();
			comandaBean.setIdComanda(comanda.getId());
			comandaBean.setNumeroMesa(comanda.getNumeroMesa());
			comandaBean.setEstado(comanda.getEstado());
			comandaBean.setItems(AdministradorItemComanda.getInstancia().fromModelTOBean(comanda.getItems()));
		}
		return comandaBean;
	}
	private void updateItemsComanda(Comanda c) {
		List<Comanda>comandas=new ArrayList<Comanda>();
		comandas.add(c);
		List<ComandaBean>cb=this.fromModelTOBean(comandas);
		HibernateComandaDAO.getInstancia().updateItemsComanda(cb.get(0));
		
	}
	public ComandaDTO fromModelTODTO(Comanda comanda) {
		ComandaDTO comandaDTO=null;
		if(comanda!=null){
		comandaDTO=new ComandaDTO();
		comandaDTO.setId(comanda.getId());
		comandaDTO.setNumeroMesa(comanda.getNumeroMesa());
		comandaDTO.setEstado(comanda.getEstado());
		comandaDTO.setItems(AdministradorItemComanda.getInstancia().fromModelTODTO(comanda.getItems()));
		}
		return comandaDTO;
	}
}

